/**
 * TextObj
 *
 */
if(typeof (module) !="undefined"){
    module.exports = TextObj;


    var PrintObj = require('./PrintObj');
    var ParaContour = require('./../common/ParaContour');
    var Serializer = require('./Serializer');
}


function TextObj()
{
    PrintObj.call(this);        // 继承

    this.di = ""; // db-id,文字在db中的id
    this.fn ="";// font-name，字体
    this.fs = 0;// font-size，字号
    this.bi = 0;// bold/italic 0.常规   1.粗体   2.斜体   3.粗斜体
    this.po = 1; // position 1.靠左   2.居中   3.靠右
    this.cs = 2; // char space，字间距
    this.ls = 10; // line space，行间距
    this.te = ""; // text
    this.td = TextObj.prototype.TEXT_DIRECTION_HORIZON; // 默认横排
    
    // 前台临时使用，保存到后台时不需要使用
    this.pc =new ParaContour(); // 字轮廓


    this.ct = Serializer.prototype.CLASS_TYPE_TEXTOBJ;
}
TextObj.prototype = new PrintObj(); // 继承

// position 1.靠左   2.居中   3.靠右
TextObj.prototype.POSITION_LEFT = 1;
TextObj.prototype.POSITION_CENTER = 2;
TextObj.prototype.POSITION_RIGHT = 3;
TextObj.prototype.POSITION_DISPERSE = 4; // 	分散对齐
// bold/italic 0.常规   1.粗体   2.斜体   3.粗斜体
TextObj.prototype.BI_NORMAL = 0;
TextObj.prototype.BI_BOLD = 1;
TextObj.prototype.BI_ITALIC = 2;
TextObj.prototype.BI_BOLD_ITALIC = 3;
// textDirection文字方向：0 横排、1 竖排
TextObj.prototype.TEXT_DIRECTION_HORIZON = 0;
TextObj.prototype.TEXT_DIRECTION_VERTICLE = 1;

// 转成json字符串
TextObj.prototype.toJson = function (){
    // 去掉父json字符串的头尾
    var superJson = PrintObj.prototype.toJson.call(this);
    superJson = superJson.substr(1,superJson.length-2);

    var ret = '{';
    ret +=superJson;
    ret +=',';
    ret +=('"di":'+'"'+this.di+'"');
    ret +=',';
    ret +=('"fn":'+'"'+this.fn+'"');
    ret +=',';
    ret +=('"fs":'+'"'+this.fs+'"');
    ret +=',';
    ret +=('"bi":'+'"'+this.bi+'"');
    ret +=',';
    ret +=('"po":'+'"'+this.po+'"');
    ret +=',';
    ret +=('"te":'+'"'+this.te+'"'); // 注意这里用的是将换行符转义过的文字
    ret +=',';
    ret +=('"cs":'+'"'+this.cs+'"');
    ret +=',';
    ret +=('"ls":'+'"'+this.ls+'"');
    ret +=',';
    ret +=('"td":'+'"'+this.td+'"');
    if(this.pc) // 文字以后要改用di存储
    {
        ret +=',';
        ret +=('"pc":'+this.pc.toJson());
    }


    ret+='}';
    return ret;
}
// 从json对象中解析出PointPath
TextObj.prototype.fromJson = function(jsonObj, versionId){// 继承
    PrintObj.prototype.fromJson.call(this, jsonObj,versionId);  //  继承

    this.di = jsonObj.di;
    this.fn = jsonObj.fn;
    this.fs = jsonObj.fs*1;
    this.bi = jsonObj.bi;
    this.po = jsonObj.po;
    this.te = jsonObj.te;
    this.cs = jsonObj.cs*1;
    this.ls = jsonObj.ls*1;
    if(jsonObj.hasOwnProperty('td'))
        this.td = jsonObj.td;
    if(jsonObj.hasOwnProperty('pc')) // 文字使用用di存储轮廓点，使用pc存储pc的矩阵、每个字的x\y\w\h\变换矩阵
    {
        this.pc.fromJson(jsonObj.pc,versionId);
    }
}


/**
 * 将对象添加到PDF中
 * @param doc  PDFDocument结构
 * @param info  对象结构，属性如下：
 *                  docOriginX  文档的新原点 在原始原点的 坐标
 *                  docOriginY  文档的新原点 在原始原点的 坐标
 *                  clip        （在GraphObj对象中有效）true表示剪切蒙版，false表示普通对象
 */
TextObj.prototype.addToPdf = function(doc, info){
    // 保存上下文环境
    Serializer.prototype.before.call(this, doc, info);


    // 表示普通对象
//    doc.fillColor(this.color())
//        .strokeColor(this.strokeColor())
//        .lineWidth(this.strokeWidth())
//        .opacity(this.al);
//    var svgPath = this.pc.toSvgPath();
//    for(var i=0;i<svgPath.length;i++){
//        var para = svgPath[i];
//        for(var j=0;j<para.length;j++){
//            var ch =  para[j];
//            //doc.path(ch).fill('even-odd').stroke();
//            doc.path(ch).fillAndStroke(this.color(),this.strokeColor());
//
//        }
//    }

    var svgPath = this.pc.toSvgPath();
    for(var i=0;i<svgPath.length;i++){
        var para = svgPath[i];
        for(var j=0;j<para.length;j++){
            var ch =  para[j];
            Serializer.prototype.drawSvgPath.call(this, doc, this.color(),this.strokeColor(),
                this.strokeWidth(), this.lineCap(),this.lineJoin(),
                this.miterLimit(),this.al, ch);
        }
    }

    // 还原上下文环境
    Serializer.prototype.after.call(this, doc,info);

}

/**
 * 取得模板中所有文字的轮廓 的di,
 * 返回：数组
 */
TextObj.prototype.getTextContourDis = function(){
    var ret = new Array();
    ret.push(this.di);
    return ret;
}

/**
 * 设置所有文字的轮廓
 * 参数：vectors： TVectorModel类型的数组
 */
TextObj.prototype.setTextContour = function(vectors){
    for(var i=0;i<vectors.length;i++){
        var vec = vectors[i];
        if(vec.hasOwnProperty('visit')) continue;

        if(!vec.id.equals(this.di)) continue;

        vec.visit = true;
        // 赋值
        this.pc = vec.content;
        // 缩放
        var scale =  this.w/this.pc.w;
        this.pc.adjustPosition(scale, 2);

    }
}
/**
 * 取得模板中所有文字对象,
 * 参数：ignoreEmptyDi，true表示需要过滤掉无效di的文字对象
 * 返回：数组
 */
TextObj.prototype.getTextObjs = function(ignoreEmptyDi){
    var ret = new Array();
    if(ignoreEmptyDi ){
        if(this.di&& this.di!=""){
            ret.push(this);
        }
    }else{
        ret.push(this);
    }

    return ret;
}

// 取得传递到后台的参数
TextObj.prototype.getFontSrvPara = function(){
    var ret={};
    ret.fontName = this.fn;
    ret.fontSize = this.fs;  // 
    ret.boldItalic = this.bi;
    ret.position = this.po;
    ret.charSpace = this.cs;
    ret.lineSpace = this.ls;
    ret.text = this.te;
    ret.paraWidth = Number(this.w.toFixed(0));
    return ret;
}
// 根据文字的字间距、行间距调整文字
TextObj.prototype.adjustAllChar = function(){
    this.td == TextObj.prototype.TEXT_DIRECTION_HORIZON?this.adjustAllCharToHorizon():this.adjustAllCharToVerticle();
}

// 将文字调整为横向
TextObj.prototype.adjustAllCharToHorizon = function(){
    // 调整字的x\y
    var to = this;
    var c = to.pc;
    for(var i=0; i<c.paras.length; i++){
        var onePara = c.paras[i];


        // 计算当前行的纵坐标
        var curLineY = 0;
        if(i>0){
            var lastLineFirstChar = c.paras[i-1].chars[0];
            curLineY = lastLineFirstChar.y+c.paras[i-1].h+to.ls;
        }

        // 修正本行所有字的x
        for(var j=0; j<onePara.chars.length; j++){
            var char = onePara.chars[j];

            // 每行的第一个字的x为0
            char.x = (j==0)?0:char.x;
            if(j>0){
                // 调整每行的非首个字的x坐标
                var prevChar = onePara.chars[j-1];
                char.x = prevChar.x + prevChar.w + to.cs;
            }
        }
        // 修正本行宽度
        var lastChar = onePara.chars[onePara.chars.length-1];
        var firstChar = onePara.chars[0];
        onePara.w = lastChar.x + lastChar.w - firstChar.x;

        // 修正本行所有字的y
        // 		找到当前行中by最大的字，将其y修正为本行的y
        // 		将当前行中剩下的字的Baseline点对齐到最大字的基准点上
        var maxBy = 0;
        for(var j=0; j<onePara.chars.length; j++){
            var char = onePara.chars[j];
            if(char.by>maxBy){
                maxBy = char.by;
            }
        }
        for(var j=0; j<onePara.chars.length; j++){
            var char = onePara.chars[j];
            char.y = curLineY+(maxBy - char.by);
        }

        // 修正本行高度
        for(var j=0; j<onePara.chars.length; j++){
            var char = onePara.chars[j];
            var charBottomY = char.y + char.h;
            var charBottomH = charBottomY - curLineY;
            onePara.h =(j==0)?charBottomH:
                (onePara.h>charBottomH?onePara.h:charBottomH);
        }

        // 修正宽度和高度
        to.pc.w = (i==0)?onePara.w:((to.pc.w > onePara.w)?to.pc.w : onePara.w);
        to.pc.h = curLineY+onePara.h;
    }
    
    // 将根据 左对齐、右对齐、居中对齐、分散对齐集中方式调整每个字的位置
    if(this.po == TextObj.prototype.POSITION_LEFT
        || this.po == TextObj.prototype.POSITION_CENTER
        || this.po == TextObj.prototype.POSITION_RIGHT){
    
        for(var i=0; i<c.paras.length; i++){
            var onePara = c.paras[i];
            var paraOffset = 0;
    
            if(this.po == TextObj.prototype.POSITION_CENTER){
                paraOffset = (this.pc.w - onePara.w)/2;
            }else if(this.po == TextObj.prototype.POSITION_RIGHT){
                paraOffset = (this.pc.w - onePara.w);
            }
    
            // 处理每个字
            for(var j=0; j<onePara.chars.length; j++){
                var ch = onePara.chars[j];
                ch.x += paraOffset;
            }
        }
    
    }else if(this.po == TextObj.prototype.POSITION_DISPERSE){
        // 分散对齐不考虑字间距
    
    }
    
    // 调整本身大小
    to.w = to.pc.w;
    to.h = to.pc.h;

}
// 将文字调整为纵向（从右到左、从上到下）
TextObj.prototype.adjustAllCharToVerticle = function(){
    // 调整字的x\y
    var to = this;
    var c = to.pc;
    for(var i=0; i<c.paras.length; i++){
        var onePara = c.paras[i];

        // 计算当前列的横坐标
        var curLineX = 0;
        if(i>0){
            var lastLineFirstChar = c.paras[i-1].chars[0];
            curLineX = lastLineFirstChar.x+c.paras[i-1].w+to.ls;
        }

        // 修正本列所有字的y
        for(var j=0; j<onePara.chars.length; j++){
            var char = onePara.chars[j];

            // 每列的第一个字的y为0
            char.y = (j==0)?0:char.y;
            if(j>0){
                // 调整每列的非首个字的y坐标
                var prevChar = onePara.chars[j-1];
                char.y = prevChar.y + prevChar.h + to.cs;
            }
        }
        // 修正本列高度
        var lastChar = onePara.chars[onePara.chars.length-1];
        var firstChar = onePara.chars[0];
        onePara.h = lastChar.y + lastChar.h - firstChar.y;

        // 修正本列所有字的x
        // 		找到当前列中bx最大的字，将其x修正为本行的x
        // 		将当前列中剩下的字的Baseline点对齐到最大字的基准点上
        var maxBx = 0;
        for(var j=0; j<onePara.chars.length; j++){
            var char = onePara.chars[j];
            if(char.bx>maxBx){
                maxBx = char.bx;
            }
        }
        for(var j=0; j<onePara.chars.length; j++){
            var char = onePara.chars[j];
            char.x = curLineX+(maxBx - char.bx);
        }

        // 修正本行宽度
        for(var j=0; j<onePara.chars.length; j++){
            var char = onePara.chars[j];
            var charRightX = char.x + char.w;
            var charRightH = charRightX - curLineX;
            onePara.w =(j==0)?charRightH:
                (onePara.w>charRightH?onePara.w:charRightH);
        }

        // 修正宽度和高度
        to.pc.h = (i==0)?onePara.h:((to.pc.h > onePara.h)?to.pc.h : onePara.h);
        to.pc.w = curLineX +onePara.w;
    }
    // 将根据 左对齐、右对齐、居中对齐、分散对齐集中方式调整每个字的位置
    if(this.po == TextObj.prototype.POSITION_LEFT
        || this.po == TextObj.prototype.POSITION_CENTER
        || this.po == TextObj.prototype.POSITION_RIGHT){
    
        for(var i=c.paras.length-1; i>=0; i--){
            var onePara = c.paras[i];
            var paraOffset = 0;
    
            if(this.po == TextObj.prototype.POSITION_CENTER){
                paraOffset = (this.pc.h - onePara.h)/2;
            }else if(this.po == TextObj.prototype.POSITION_RIGHT){
                paraOffset = (this.pc.h - onePara.h);
            }
    
            // 处理每个字
            for(var j=0; j<onePara.chars.length; j++){
                var ch = onePara.chars[j];
                ch.y += paraOffset;
            }
        }
    
    }else if(this.po == TextObj.prototype.POSITION_DISPERSE){
        // 分散对齐不考虑字间距
    
    }
    
    // 调整本身大小
    to.w = to.pc.w;
    to.h = to.pc.h;
    
}
